# 5. 참조타입
# 5.1 데이터 타입 분류
- 기본타입 : 정수타입(byte, char, short, int, long), 실수타입(float, double), 논리타입(boolean)
- 참조타입 : 배열타입, 열거타입, 클래스, 인터페이스
- 기본타입으로 선언된 변수는 값 자체를 저장
- 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장
- 참조타입인 String 클래스로 선언된 변수는 힙 메모리 영역의 String 객체 번지를 저장하고 이 번지를 통해 String 객체를 참조한다
# 5.2 메모리 사용 영역(메소드, 힙, 스택)
java 명령어로 JVM 이 구동되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area) 을 다음과 같이 구분해서 사용한다.
# 메소드 영역
- 바이트코드 파일을 읽은 내용이 저장되는 영역.
- 클래스별로 상수, 정적필드, 메소드코드, 생성자 코드 등이 저장된다.
# 힙 영역
- 객체가 생성되는 영역.
- 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조할 수 있다.
# 스택 영역
- 메소드를 호출할 때 마다 생성되는 프레임(frame)이 저장되는 영역.
- 메소드 호출이 끝아면 프레임은 자동 제거된다.
- 프레임 내부에는 로컬변수 스택이 있다. 여기서 기본타입 변수와 참조타입 변수가 생성되고 제거된다.
# 5.3 참조타입 변수의 ==, != 연산
- 참조 타입 변수의 값은 객체의 번지이므로 참조타입 변수의 ==, != 연산자는 번지를 비교하는 것이 된다.
# 5.4 null과 NullPointerException
- 참조타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null 값을 가질 수 있다
- null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
- 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려 할때 NullPointerException 발생
- 어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체가 된다. 즉, 힙메모리에는 있지만, 위치 정보를 모르기 때문에 사용할 수 없게 된다.
- 자바는 이러한 객체를 쓰레기로 취급하고, 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거한다.
- 직접 제거하는 방법 제공하지 않음. 객체를 제거하는 유일한 방법은 객체의 모든 참조를 없애는 것 이다.
# 5.5 문자열 타입
# 문자열 비교
String name1 = "홍길동"; // 문자열 리터럴
String name2 = "홍길동";
String name3 = new String("홍길동"); // new 연산자로 String 객체 별도 생성
1
2
3
2
3
name1 == name2 // true
name2 == name3 // false
name2.equals(name3) // true
# 문자 추출 : str.charAt(0)
# 문자열 길이 : str.length()
# 문자열 대체 : str.replace("자바","Java")
- String 객체의 문자열은 변경이 불가한 특성을 갖기 때문에 replace() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열이다.
# 문자열 잘라내기 : substring(int beginIndex, int endIndex)
# 문자열 찾기 : str.indexOf("프로그래밍")
- 포함 여부 조사 : str.contains("프로그래밍")
# 문자열 분리 : str.split(",")
# 5.6 배열 타입
# 배열 변수 선언
- 배열은 같은 타입의 값만 관리한다
- 배열의 길이는 늘리거나 줄일 수 없다
- 배열 선언 :
타입[] 변수
,타입 변수[]
둘다 사용 가능하나 관례적으로 첫번째 많이 사용.
# 값 목록으로 배열 생성
{} 중괄호는 나열된 값들을 항목으로 가지는 배열을 힙에 생성하고, 번지를 리턴한다. 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다.
//값 목록으로 배열 생성
타입[] 변수 = {값0, 값1, 값2, 값3, ...};
// 컴파일 에러
타입[] 변수;
변수 = {값0, 값1, 값2, 값3, ...};
// 변수 선언 시점과 값 목록이 대입되는 시점이 다를때
String[] 변수 = null;
변수 = new 타입[] {값0, 값1, 값2, 값3, ...};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# new 연산자로 배열 생성
new 연산자로 배열을 생성하면 배열 항목은 기본값으로 초기화된다.
타입[] 변수 = new 타입[길이]
타입[] 변수 = null;
변수 = new 타입[길이];
1
2
3
4
2
3
4
# 배열 길이 : 배열변수.length
# 5.7 다차원 배열
# 값 목록으로 다차원 배열 생성 : 타입[][] 변수 = { {값1, 값2, ...},{값1, 값2, ...} }
# new 연산자로 다차원 배열 생성 : 타입[][] 변수 = new 타입[1차원수][2차원수]
# 5.8 객체를 참조하는 배열
기본타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 값을 직접 저장하지만, 참조타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 저장한다.
# 5.9 배열 복사
- 배열은 한 번 생성하면 길이를 변경할 수 없다. 더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야 한다.
- 복사방법
- for문
System.arraycopy(원본배열, 원본배열 복사 시작 인덱스, 새배열, 새 배열 붙여넣기 시작 인덱스, 복사항목수)
# 5.10 배열 항목 반복을 위한 향상된 for 문
for( 타입 변수 : 배열) {
실행문
}
# 5.11 main() 메소드의 String[] 매개변수 용도
- 이클립스 : Run Configurations > Argument > 10 20 아규먼트 입력
- 터미널 : java javaprogramname 10 20
# 5.12 열거(Enum) 타입
public enum Week{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
// 열거타입 Week 변수 선언
Week today;
Week reservationDay;
Week today = Week.SUNDAY;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8